A `!path`! is a `F0af`_`[node`:/page/wiki.mu`path=Node]`_`f's local knowledge of the most optimal next hop towards a `F0af`_`[destination`:/page/wiki.mu`path=Destination]`_`f.
The node learns this passively from the destination's `F0af`_`[announce packet`:/page/wiki.mu`path=Packet|anchor=announce-packet]`_`f by recording in its `F0af`_`[path table`#table]`_`f which node the `F0af`_`[announce`:/page/wiki.mu`path=Announce]`_`f was received from, the `F0af`_`[interface`:/page/wiki.mu`path=Interface]`_`f on which it arrived and other information.
`F0af`_`[Transport nodes`:/page/wiki.mu`path=Transport_node]`_`f will maintain and persist their path tables, participate in network routing and respond to `F0af`_`[path requests`#request]`_`f.
No single node knows the full sequence of hops to a destination. The full route "emerges" from each node forwarding `F0af`_`[packets`:/page/wiki.mu`path=Packet]`_`f one hop closer to the destination, each node knowing only the next hop. There is no global routing table, and paths are dynamically updated as network topology changes.
`*`!Note:`! In the manual and elsewhere, `!path`! can sometimes mean the full route from a source to a destination. On this wiki, `!path`! is used only in its technical sense, as it is used in the code, while `!route`! denotes a full sequence of hops.`*
>>Contents
• `F0af`_`[Table`#table]`_`f
• `F0af`_`[Request`#request]`_`f
• `F0af`_`[See also`#see-also]`_`f
• `F0af`_`[References`#references]`_`f
>>Table
A node's `!path table`! maps `F0af`_`[destination hashes`:/page/wiki.mu`path=Destination|anchor=hash]`_`f to information needed to route packets, learned from the destination's `F0af`_`[announce packet`:/page/wiki.mu`path=Packet|anchor=announce-packet]`_`f:`:cite-ref-1[`F5bf`_`[1`#cite-note-1]`_`f]
1. `B100`F9d9IDX_PT_TIMESTAMP`f`b: Timestamp of when the entry was created or last updated
2. `B100`F9d9IDX_PT_NEXT_HOP`f`b: The node the announce was received from (as a destination hash)
3. `B100`F9d9IDX_PT_HOPS`f`b: Number of hops to the destination
4. `B100`F9d9IDX_PT_EXPIRES`f`b: Timestamp of when the entry expires (depends on the `F0af`_`[interface mode`:/page/wiki.mu`path=Interface|anchor=modes]`_`f of `B100`F9d9IDX_PT_RVCD_IF`f`b)
5. `B100`F9d9IDX_PT_RANDBLOBS`f`b: List of random blobs of the most recently seen announces for the destination (used to detect replayed announces)
6. `B100`F9d9IDX_PT_RVCD_IF`f`b: The interface the announce was received on
7. `B100`F9d9IDX_PT_PACKET`f`b: Hash of the cached announce packet (used for deduplication)
Entries are replaced when the node learns of a better path, and removed when paths expire or their interface disappears.
>>Request
`*See also: `F0af`_`[Interface#Path seeking`:/page/wiki.mu`path=Interface|anchor=path-seeking]`_`f`*
If a `F0af`_`[node`:/page/wiki.mu`path=Node]`_`f has no path to a `F0af`_`[destination`:/page/wiki.mu`path=Destination]`_`f, it can send out a `!path request`! on the network. `F0af`_`[Path seeking`:/page/wiki.mu`path=Interface|anchor=path-seeking]`_`f interfaces allow these requests to propagate recursively through the network. Any node that receives the request and has a path to the destination responds by rebroadcasting the cached announce, which eventually reaches the requester node. This also serves to update path tables along the way.
The path request is a regular data `F0af`_`[packet`:/page/wiki.mu`path=Packet]`_`f broadcast to the special `F0af`_`[plain`:/page/wiki.mu`path=Destination|anchor=types]`_`f destination `B100`F9d9rnstransport.path.request`f`b, which all Reticulum nodes listen to.
Path requests are rate limited.`:cite-ref-2[`F5bf`_`[2`#cite-note-2]`_`f]
`*`!Note:`! Applications should only request paths for destinations they need to communicate with. Applications that send large amounts of unnecessary path requests will get rate limited by transport nodes, negatively affecting the system they are running on.`*
>>See also
• `F0af`_`[Announce`:/page/wiki.mu`path=Announce]`_`f
• `F0af`_`[Destination`:/page/wiki.mu`path=Destination]`_`f
• `F0af`_`[rnpath`:/page/wiki.mu`path=Rnpath]`_`f
>>References
`:cite-note-1`!1.`! `F0af`_`[↑`#cite-ref-1]`_`f `F0af`_`[Aleph Git ↗`a8d24177d946de4f1f0a0fe1af9a1338:/page/blob.mu`g=reticulum|r=reticulum|ref=HEAD|path=RNS/Transport.py]`_`f
`:cite-note-2`!2.`! `F0af`_`[↑`#cite-ref-2]`_`f `*Path Request Burst Control`*, Manual. `F0af`_`[`a8d24177d946de4f1f0a0fe1af9a1338:/page/blob.mu`g=reticulum|r=reticulum|ref=HEAD|path=docs/markdown/interfaces.md|anchor=path-request-burst-control] ↗`_`f
>>Reticulum concepts
`F0af`_`[Announce`:/page/wiki.mu`path=Announce]`_`f • `F0af`_`[Blackhole`:/page/wiki.mu`path=Blackhole]`_`f • `F0af`_`[Buffer`:/page/wiki.mu`path=Buffer]`_`f • `F0af`_`[Channel`:/page/wiki.mu`path=Channel]`_`f • `F0af`_`[Destination`:/page/wiki.mu`path=Destination]`_`f • `F0af`_`[Discovery`:/page/wiki.mu`path=Discovery]`_`f • `F0af`_`[Identity`:/page/wiki.mu`path=Identity]`_`f • `F0af`_`[Instance`:/page/wiki.mu`path=Instance]`_`f • `F0af`_`[Interface`:/page/wiki.mu`path=Interface]`_`f • `F0af`_`[Interface Access Code`:/page/wiki.mu`path=Interface_Access_Code]`_`f (IFAC) • `F0af`_`[Link`:/page/wiki.mu`path=Link]`_`f • `F0af`_`[Network identity`:/page/wiki.mu`path=Network_identity]`_`f • `F0af`_`[Node`:/page/wiki.mu`path=Node]`_`f • `F0af`_`[Packet`:/page/wiki.mu`path=Packet]`_`f • Path • `F0af`_`[Propagation node`:/page/wiki.mu`path=Propagation_node]`_`f • `F0af`_`[Resource`:/page/wiki.mu`path=Resource]`_`f • `F0af`_`[Stamp`:/page/wiki.mu`path=Stamp]`_`f • `F0af`_`[Transport node`:/page/wiki.mu`path=Transport_node]`_`f
>>Path
`!Source:`! `F0af`_`[Transport.py ↗`a8d24177d946de4f1f0a0fe1af9a1338:/page/blob.mu`g=reticulum|r=reticulum|ref=HEAD|path=RNS/Transport.py]`_`f
`!API:`! `F0af`_`[RNS.Transport ↗`a8d24177d946de4f1f0a0fe1af9a1338:/page/blob.mu`g=reticulum|r=reticulum|ref=HEAD|path=docs/markdown/reference.md|anchor=RNS.Transport]`_`f